package com.dabai.qrtools.utils;

import static android.content.Context.DOWNLOAD_SERVICE;

import android.app.Activity;
import android.app.DownloadManager;
import android.app.KeyguardManager;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AlertDialog;

import com.dabai.qrtools.R;
import com.dabai.qrtools.data.ConstantValues;
import com.dabai.qrtools.ui.BrowserActivity;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar;

import java.util.Random;
import java.util.UUID;

/**
 * 非常强大的全能工具类
 *
 * @author BAI
 */
public class DabaiUtils {


    /**
     * 密码身份验证
     *
     * 在onActivityResult
     *  //验证结果
     *         if (resultCode == RESULT_CANCELED && requestCode == 888) {
     *             DBToast.showText(context, "身份验证失败!", false);
     *             finish();
     *         }
     *
     * @param reqCode  申请代码
     * @param activity 活动
     */
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public static void jumpPasswordAuthentication(@NonNull Activity activity, int reqCode){
        KeyguardManager km = (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE);
        if (km.isKeyguardSecure()) {
            Intent kmr = km.createConfirmDeviceCredentialIntent("请验证身份", "请输入密码或进行生物识别");
            activity.startActivityForResult(kmr, reqCode);
        }
    }



    /**
     * 调用系统 下载管理器 下载文件
     * @param context 上下文
     * @param fileName 本地文件名
     * @param url 网络地址
     * @param contentDisposition 下载管理器描述信息
     * @param mimeType 下载类型
     * @return 下载管理器的文件回调id
     */
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    public static long downloadBySystem(Context context, String fileName, String url, String contentDisposition, String mimeType) {
        // 指定下载地址
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
        // 设置通知的显示类型，下载进行时和完成后显示通知
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        // 设置通知栏的描述
        request.setDescription(contentDisposition);
        // 允许在计费流量下下载
        request.setAllowedOverMetered(true);
        // 允许漫游时下载
        request.setAllowedOverRoaming(true);
        // 设置下载文件保存的路径和文件名
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
        final DownloadManager downloadManager = (DownloadManager) context.getSystemService(DOWNLOAD_SERVICE);
        // 添加一个下载任务
        return downloadManager.enqueue(request);
    }

    /**
     * 复制文本
     *
     * @param context 上下文
     * @param text    文本
     */
    public static void copyText(Context context, String text) {
        ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
        ClipData mclipData = ClipData.newPlainText("DABAI", text);
        clipboardManager.setPrimaryClip(mclipData);
        showToast(context, "复制成功");
    }

    /**
     * 获取剪切板上的 最后复制的内容
     *
     * @param context 上下文
     * @return {@link String}
     */
    @NonNull
    public static String getClipboardContent(Context context) {
        ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
        if (cm != null) {
            ClipData data = cm.getPrimaryClip();
            if (data != null && data.getItemCount() > 0) {
                ClipData.Item item = data.getItemAt(0);
                if (item != null) {
                    CharSequence sequence = item.coerceToText(context);
                    if (sequence != null) {
                        return sequence.toString();
                    }
                }
            }
        }
        return "";
    }

    /**
     * 是否是第一次 打开这个活动
     * 这个方法一定要传入 this ,不然不能识别activity
     *
     * @param context 上下文
     * @return boolean
     */
    public static boolean isActivityFirstOpen(Context context) {
        String value = getSharedPreferencesString(context, context.getClass().getName() + "_first", "null");
        if ("null".equals(value)) {
            setSharedPreferencesString(context, context.getClass().getName() + "_first", "ThisIsNotFirstTime");
            return true;
        }
        return false;
    }

    /**
     * 是否是第一次 使用这个方法 传入关键字
     * 这个方法一定要传入 this ,不然不能识别activity
     *
     * @param context 上下文
     * @param key     关键
     * @return boolean
     */
    public static boolean isFunctionFirstOpen(Context context,String key) {
        String value = getSharedPreferencesString(context, key + "_first", "null");
        if ("null".equals(value)) {
            setSharedPreferencesString(context, key + "_first", "ThisIsNotFirstTime");
            return true;
        }
        return false;
    }


    /**
     * 获取设备唯一识别 随机名称
     * 第一次获取 随机生成,之后就用这个
     * 清除数据 会重置
     *
     * @param context 上下文
     * @return {@link String}
     */
    public static String getDeviceName(Context context) {
        String value = getSharedPreferencesString(context, Build.MODEL + "_name", "null");
        if ("null".equals(value)) {
            setSharedPreferencesString(context, Build.MODEL + "_name", (Build.MODEL + "_" + new Random().nextInt(100000)).replace(" ", ""));
            return getSharedPreferencesString(context, Build.MODEL + "_name", "null");
        }

        return value;
    }

    /**
     * 获取设备唯一识别码
     * 第一次获取 随机生成UUID,之后就用这个UUID
     * 清除数据 会重置
     *
     * @param context 上下文
     * @return {@link String}
     */
    public static String getDeviceId(Context context) {
        String value = getSharedPreferencesString(context, Build.MODEL + "_id", "null");
        if ("null".equals(value)) {
            setSharedPreferencesString(context, Build.MODEL + "_id", "" + UUID.randomUUID());
            return getSharedPreferencesString(context, Build.MODEL + "_id", "null");
        }

        return value;
    }


    /**
     * 换行追加共享参数字符串
     *
     * @param context 上下文
     * @param key     关键
     * @param value   价值
     * @return boolean
     */
    public static boolean addSharedPreferencesString(Context context, String key, String value) {
        SharedPreferences sp = context.getSharedPreferences("data", 0);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString(key, getSharedPreferencesString(context, key, "") + value + "\n");
        return editor.commit();
    }

    /**
     * 设置共享参数字符串
     *
     * @param context 上下文
     * @param key     键
     * @param value   值
     * @return boolean
     */
    public static boolean setSharedPreferencesString(Context context, String key, String value) {
        SharedPreferences sp = context.getSharedPreferences("data", 0);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString(key, value);
        return editor.commit();
    }

    /**
     * 得到共享参数字符串
     *
     * @param context 上下文
     * @param key     键
     * @param value   值
     * @return {@link String}
     */
    public static String getSharedPreferencesString(Context context, String key, String value) {
        SharedPreferences sp = context.getSharedPreferences("data", 0);
        return sp.getString(key, value);
    }

    /**
     * 得到设置默认的 配置表
     *
     * @param context 上下文
     * @return {@link SharedPreferences}
     */
    public static SharedPreferences getSettingSharedPreferences(Context context) {
        return context.getSharedPreferences(context.getPackageName() + "_preferences", 0);
    }


    /**
     * 显示 系统土司, 但是 只能同时显示一个
     *
     * @param context 上下文
     * @param text    文本
     */
    public static void showToast(Context context, String text) {
        ToastUtils.show(context, text);
    }

    /**
     * 显示 SnackBar 底部提示,传入 getWindow().getDecorView()  活动布局最好使用 CoordinatorLayout 作为根布局
     *
     * @param view 视图
     * @param text 文本
     */
    public static void showSnack(View view, String text) {
        Snackbar.make(view, text, Snackbar.LENGTH_LONG).show();
    }

    /**
     * 显示对话框
     * 显示 AlertDialog 默认主题为 mdc
     * 只有确认按钮,用来显示 提示信息
     *
     * @param context 上下文
     * @param text    文本
     */
    public static AlertDialog showDialog(Context context, String text) {
        return new MaterialAlertDialogBuilder(context).setTitle("提示")
                .setMessage(text)
                .setPositiveButton("确认", null)
                .show();
    }

    /**
     * 显示对话框
     * 显示 AlertDialog 默认主题为 mdc
     * 只有确认按钮,用来显示 提示信息
     *
     * @param context 上下文
     * @param title   标题
     * @param text    文本
     */
    public static AlertDialog showDialog(Context context, String title, String text) {
       return new MaterialAlertDialogBuilder(context).setTitle(title)
                .setMessage(text)
                .setPositiveButton("确认", null)
                .show();
    }


    /**
     * 到 本应用的信息界面
     *
     * @param context 上下文
     */
    public static void toMyAppInfo(Context context) {
        Intent intent = new Intent("android.settings.APPLICATION_DETAILS_SETTINGS");
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setData(Uri.parse("package:" + context.getPackageName()));
        context.startActivity(intent);
    }

    /**
     * 检查root权限
     *
     * @return boolean
     */
    public static boolean isRoot() {

        try {
            Process process = Runtime.getRuntime().exec("su");
            process.getOutputStream().write("exit\n".getBytes());
            process.getOutputStream().flush();

            int i = process.waitFor();
            if (0 == i) {
                Runtime.getRuntime().exec("su");
                return true;
            }

        } catch (Exception e) {
            return false;
        }
        return false;
    }





    /**
     * 动态检查权限
     * 常见权限  要写在清单文件才能动态调用
     * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     * <uses-permission android:name="android.permission.INTERNET"/>
     * <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
     *
     * 在这里,强烈推荐 郭霖的 PermissionX 工具 , 百度一下你就知道
     *
     **/
    public static boolean isPermissionChecked(Context context, String manifest) {
        //检查代码是否拥有这个权限
        int checkResult = context.checkCallingOrSelfPermission(manifest);
        //if(!=允许),抛出异常
        return checkResult == PackageManager.PERMISSION_GRANTED;
    }

    /**
     * 打开指定链接
     *
     * @param context 上下文
     * @param link    链接
     */
    public static void openLink(Context context, String link) {

        try {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(link));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            context.startActivity(intent);
        } catch (Exception e) {
            Toast.makeText(context, "无法打开指定地址!", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 通过内建浏览器打开链接
     *
     * @param context 上下文
     * @param link    链接
     */
    public static void openLinkWithBrowserActivity(Context context, String link) {

        try {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.setClass(context, BrowserActivity.class);
            intent.setData(Uri.parse(link));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);

        } catch (Exception e) {
            Toast.makeText(context, "无法打开指定地址!", Toast.LENGTH_SHORT).show();
            Log.d("DBTAG", "openLinkWithBrowserActivity: "+e.getMessage());
        }
    }


    /**
     * 将bitmap中的某种颜色值替换成新的颜色
     *
     * @param oldBitmap 旧的位图
     * @param oldColor  旧的颜色
     * @param newColor  新颜色
     * @return {@link Bitmap}
     */
    public static Bitmap replaceBitmapColor(Bitmap oldBitmap, int oldColor, int newColor) {
        //相关说明可参考 http://xys289187120.blog.51cto.com/3361352/657590/
        Bitmap mBitmap = oldBitmap.copy(Bitmap.Config.ARGB_8888, true);
        //循环获得bitmap所有像素点
        int mBitmapWidth = mBitmap.getWidth();
        int mBitmapHeight = mBitmap.getHeight();
        for (int i = 0; i < mBitmapHeight; i++) {
            for (int j = 0; j < mBitmapWidth; j++) {
                //获得Bitmap 图片中每一个点的color颜色值
                //将需要填充的颜色值如果不是
                //在这说明一下 如果color 是全透明 或者全黑 返回值为 0
                //getPixel()不带透明通道 getPixel32()才带透明部分 所以全透明是0x00000000
                //而不透明黑色是0xFF000000 如果不计算透明部分就都是0了
                int color = mBitmap.getPixel(j, i);
                //将颜色值存在一个数组中 方便后面修改
                if (color == oldColor) {
                    mBitmap.setPixel(j, i, newColor);
                    //将白色替换成透明色
                }

            }
        }
        return mBitmap;
    }


    /**
     * 返回桌面
     *
     * @param context 上下文
     */
    public static void backHome(Context context) {
        Intent intent = new Intent();
        // 为Intent设置Action、Category属性
        intent.setAction(Intent.ACTION_MAIN);
        // "android.intent.action.MAIN"
        intent.addCategory(Intent.CATEGORY_HOME);
        //"android.intent.category.HOME"
        context.startActivity(intent);
    }




    /**
     * 调用adm下载链接
     */
    public static void admDownload(Context context, String link) {
        Intent intent = new Intent();
        intent.setData(Uri.parse(link));
        intent.setClassName("com.dv.adm.pay", "com.dv.get.AEditor");
        context.startActivity(intent);
    }

    /**
     *  跳转 应用商店 搜索本应用
     */
    public static void toStore(Context context) {
        try {
            Uri uri = Uri.parse("market://details?id=" + context.getPackageName());
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        } catch (Exception e) {
            Toast.makeText(context, "您的手机没有安装应用市场", Toast.LENGTH_SHORT).show();
        }
    }


}